﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Xml.Linq;

namespace TMS
{
    public enum usuarioEstado
    {
        Inactivo = 0,
        Activo = 1,
        Eliminado = 2
    }
    public enum tipoUsuario { 
        Administrador = 0,
        Tester = 1,
        Developer = 2
    }
    public class Usuario
    {
        #region ATRIBUTOS

        private long _NroUsuario;
        private string _Nombre;
        private string _Nick;
        private string _Password;
        private string _Mail;
        private usuarioEstado _Estado;
       /*private tipoUsuario _Tipo;*/

        #endregion

        #region PROPERTIES

        public long NroUsuario
        {
            get { return _NroUsuario; }
            set { _NroUsuario = value; }
        }
        public string Nombre
        {
            get { return _Nombre; }
            set { _Nombre = value; }
        }
        public string Nick
        {
            get { return _Nick; }
            set { _Nick = value; }
        }
        public string Password
        {
            get { return _Password; }
            set { _Password = value; }
        }
        public string Mail
        {
            get { return _Mail; }
            set { _Mail = value; }
        }
        public usuarioEstado Estado
        {
            get { return _Estado; }
            set { _Estado = value; }
        }
        /*public tipoUsuario Tipo
        {
            get { return _Tipo; }
            set { _Tipo = value; }
        }*/

        #endregion

        #region CONSTRUCTORES

        public Usuario(long pNro, string pNombre, string pNick, string pPassword, string pMail/*, string ptipo*/)
        {
            _NroUsuario = pNro;
            _Nombre = pNombre;
            _Nick = pNick;
            _Password = pPassword;
            _Mail = pMail;
            _Estado = usuarioEstado.Inactivo; /*Por defecto todos los usuarios estan inactivos al registrarse.*/
           /* _Tipo = (tipoUsuario)Enum.Parse(typeof(tipoUsuario), ptipo);*/
        }
        
        public Usuario()
        { }
        public Usuario(long pNro, string pNic, string pPassword, string pMail)
        {
            _NroUsuario = pNro;
            _Nick = pNic;
            _Password = pPassword;
            _Mail = pMail;
            _Estado = usuarioEstado.Activo;
        }
        public Usuario(long pNro, string pNombre, string pMail, usuarioEstado pEstado) /* Constructor sin password*/
        {
            _NroUsuario = pNro;
            _Nombre = pNombre;
            _Mail = pMail;
            _Estado = pEstado;
        }
        #endregion

        #region METODOS

        public void newUsuario()
        {
            UsuarioXMLManager.getInstancia().addUsuario(this);
        }
        public void modUsuario()
        {
            UsuarioXMLManager.getInstancia().updateUsuario(this);
        }
        public void remUsuario()
        {
            UsuarioXMLManager.getInstancia().eliminarUsuario(this.NroUsuario);
        }
        public static void removeUsuarioByTipo(long pUsuId, string pTipoUsu)
        {
            /*
             * Este metodo esta diseñado para participar en la modificacion de un usuario por parte
             * de un Administrador, en caso de que se desee modificar el tipo o Rol del usuario.
             * Elimina el usuario del registro especializado, ya sea Administrador, Developer o Tester,
             * dependiendo del tipo que se reciba como parametro.
             * pero NO elimina al usuario del documento XML Usuarios.
             */ 
            switch (pTipoUsu)
            {
                case "Administrador":
                    if (AdministradorXMLManager.getInstancia().existsById(pUsuId))
                    {
                        AdministradorXMLManager.getInstancia().removeByIdUsuario(pUsuId);
                    }
                    break;
                case "Tester":
                    if (TesterXMLManager.getInstancia().existsById(pUsuId))
                    {
                        TesterXMLManager.getInstancia().removeByIdUsuario(pUsuId);
                    }
                    break;
                case "Developer":
                    if (DeveloperXMLManager.getInstancia().existsById(pUsuId))
                    {
                        DeveloperXMLManager.getInstancia().removeByIdUsuario(pUsuId);
                    }
                    break;
            }
        }
        public void activarUsu()
        {
            UsuarioXMLManager.getInstancia().altaUsuario(this.NroUsuario);
        }
        public static bool existeUsuario(string pNick)
        {
            return UsuarioXMLManager.getInstancia().existeUsuario(pNick);
        }
        public static Usuario getUsuarioById(long pId)
        {
            return UsuarioXMLManager.getInstancia().getUsuarioById(pId);
        }
        public static List<Usuario> getListActivos()
        {
            return UsuarioXMLManager.getInstancia().getListActivos();
        }
        public static List<Usuario> getListInactivos()
        {
            return UsuarioXMLManager.getInstancia().getListInactivos();
        }
        public static List<Usuario> getListEliminados()
        {
            return UsuarioXMLManager.getInstancia().getListEliminados();
        }
        public static List<Usuario> getListAllUsuarios()
        {
            List<Usuario> lst = new List<Usuario>();
            foreach (Usuario u in getListActivos())
            {
                lst.Add(u);
            }
            foreach (Usuario u in getListInactivos())
            {
                lst.Add(u);
            }
            foreach (Usuario u in getListEliminados())
            {
                lst.Add(u);
            }
            return lst;
        }
        public static Usuario verifPass(string pNomUsuario, string pPassword)
        {
            return UsuarioXMLManager.getInstancia().verificarPass(pNomUsuario, pPassword); 
        }
        public static long getUltimoId()
        {
            return UsuarioXMLManager.getInstancia().getUltimoId();
        }
        public static string getTipoUsuario(long pId)
        {
            return UsuarioXMLManager.getInstancia().getTipoUsuario(pId);
        }
        public override string ToString()
        {
            return "Nombre: " + _Nombre + ", Rol: " + getTipoUsuario(_NroUsuario) + ", Nick: " + _Nick + ", e-Mail: " + _Mail;
        }
        #endregion
    }
}